const state = {
	visitedViews: [],
	cachedViews: [],
	iframeViews: [],
	cachedViews: [
		"Schedule",
		"Workflow_menu",
		"TaskAllocation_menu",
		"TaskFilling_menu",
		"repairChange",
		"TaskFillingRepair",
		"FilercvList",
		"Nostandard",
		"approveTemplete",
		"CreateForm",
		"packagerecords",
		"PackageRecords",
		"Deliver",
		"Record",
		"NostandardList",
		"ArmyOther",
		"Armycheck",
		"CheckList",
		"TArmyCheck",
		"TArmyOther",
		"TArmyExamine",
		"TArmyHistory",
		"Information",
		"UnqualifiedList",
		"Historyinformation",
		"CoutsourceFilling",
		"Repair1",
		"TArmyCheckList",
		"RedundantControllers",
		"PropertyRegistrationOuter",
		"RedundantController",
		"RepairList",
		"PropertyRegistrationRecord",
		"Armylist",
		"Synthesize_menu",
		"Qmeasure",
		"Qrecord",
		"QualityExam",
		"QualityExam2",
		"Quality_menu",
		"productListTimes",
		"ContractInovice",
		"Contract",
		"Instrument",
		"Invoice",
		"Equipment",
		"ApplyPlist",
		"AuxiliaryConsumablesType",
		"AuxiliaryConsumables",
		"FinanceInovice",
		"coutsourceQuality",
		"Coutsource",
		"SalesDocument",
		"InspectStock",
		"Inspect",
		"synthesize",
		"eoutsourceStock",
		"amountrecords",
    "RepairPlans",
		"sinspectlistStoreSynthesize",
		"PartSynthesize",
		"Part",
		"Oentrance",
		"oentranceSynthesize",
		"entranceStoreSynthesize",
		"entrancelistStroeSynthesize",
		"sinspectStoreSynthesize",
		"qmeasureQuality",
		"PlanListQuality",
		"Planlist",
		"qTaskQuality",
		"qualityInspection",
		"QualityQualityExam",
		"QualityQualityExam2",
		"sentranceStock",
		"Sentrance",
		"RepairProductProcessProduct",
		"Rcvlist",
		"Applylist",
		"ApplyLists",
		"Unqualified",
		"writes",
		"Index",
		"Device",
		"Services",
		"ConsumeType",
		"Consume",
		"User",
		"changeRepair",
		"YearMaintenance",
		"RepairProductProcess",
		"YearPercentageComplete",
		"WorkshopSection",
		"Qualification",
		"ProvinceCustomer",
		"DeviceType",
		"menuLists",
		"outerList",
		"RepairProductProcessMenu",
		"coutsources",
		"Workflow",
		"DeviceMaintenanceItem",
		"DeviceContent",
		"Product",
		"Product_menu",
		"productPart",
		"productTechnology_menu",
		"ProductStep",
		"productMustPart",
		"productTechnology",
		"ProductTechnology_menu",
		"ProductTechnologyVersions",
		"productTechnologyName",
		"productProcessStepPart",
		"productProcessStep",
		"productProcess",
		"Repair",
		"Repairs",
		"maintainPlan",
		"TaskAllocation",
		"TDeviceMaintenanceTask",
		"Faultlist",
		"rcvlistList",
		"FilercvFileList",
		"ProductPlan",
		"MonthLevel",
		"maintainPlans",
		"Repair_menu",
		"ProductSumList",
		"repairProduct",
		"Production",
		"Maintain",
		"FillIn",
		"Temperature",
		"MaintainTask"
	]
}

const mutations = {
	cached_view: (state, componentName) => {
		const index = state.cachedViews.indexOf(componentName)
		console.log(componentName)
		//
		if (index > -1) {
			state.cachedViews.splice(index, 1)
		}
		// state.cachedViews = state.cachedViews.filter(
		//     name => name !== componentName
		//   );
	},
	cached_view_add: (state, componentName) => {
		const index = state.cachedViews.indexOf(componentName)
		if (index === -1) {
			state.cachedViews.push(componentName)
		}
		// state.cachedViews = state.cachedViews.filter(
		//     name => name !== componentName
		//   );
	},
	ADD_IFRAME_VIEW: (state, view) => {
		if (state.iframeViews.some(v => v.path === view.path)) return
		state.iframeViews.push(
			Object.assign({}, view, {
				title: view.meta.title || "no-name"
			})
		)
	},
	ADD_VISITED_VIEW: (state, view) => {
		if (state.visitedViews.some(v => v.path === view.path)) return
		state.visitedViews.push(
			Object.assign({}, view, {
				title: view.meta.title || "no-name"
			})
		)
	},
	ADD_CACHED_VIEW: (state, view) => {
		if (state.cachedViews.includes(view.name)) return
		if (view.meta && !view.meta.noCache) {
			state.cachedViews.push(view.name)
		}
	},
	DEL_VISITED_VIEW: (state, view) => {
		for (const [i, v] of state.visitedViews.entries()) {
			if (v.path === view.path) {
				state.visitedViews.splice(i, 1)
				break
			}
		}
		state.iframeViews = state.iframeViews.filter(item => item.path !== view.path)
	},
	DEL_IFRAME_VIEW: (state, view) => {
		state.iframeViews = state.iframeViews.filter(item => item.path !== view.path)
	},
	DEL_CACHED_VIEW: (state, view) => {
		const index = state.cachedViews.indexOf(view.name)
		index > -1 && state.cachedViews.splice(index, 1)
	},

	DEL_OTHERS_VISITED_VIEWS: (state, view) => {
		state.visitedViews = state.visitedViews.filter(v => {
			return v.meta.affix || v.path === view.path
		})
		state.iframeViews = state.iframeViews.filter(item => item.path === view.path)
	},
	DEL_OTHERS_CACHED_VIEWS: (state, view) => {
		const index = state.cachedViews.indexOf(view.name)
		if (index > -1) {
			state.cachedViews = state.cachedViews.slice(index, index + 1)
		} else {
			state.cachedViews = []
		}
	},
	DEL_ALL_VISITED_VIEWS: state => {
		// keep affix tags
		const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
		state.visitedViews = affixTags
		state.iframeViews = []
	},
	DEL_ALL_CACHED_VIEWS: state => {
		state.cachedViews = []
	},
	UPDATE_VISITED_VIEW: (state, view) => {
		for (let v of state.visitedViews) {
			if (v.path === view.path) {
				v = Object.assign(v, view)
				break
			}
		}
	},
	DEL_RIGHT_VIEWS: (state, view) => {
		const index = state.visitedViews.findIndex(v => v.path === view.path)
		if (index === -1) {
			return
		}
		state.visitedViews = state.visitedViews.filter((item, idx) => {
			if (idx <= index || (item.meta && item.meta.affix)) {
				return true
			}
			const i = state.cachedViews.indexOf(item.name)
			if (i > -1) {
				state.cachedViews.splice(i, 1)
			}
			if (item.meta.link) {
				const fi = state.iframeViews.findIndex(v => v.path === item.path)
				state.iframeViews.splice(fi, 1)
			}
			return false
		})
	},
	DEL_LEFT_VIEWS: (state, view) => {
		const index = state.visitedViews.findIndex(v => v.path === view.path)
		if (index === -1) {
			return
		}
		state.visitedViews = state.visitedViews.filter((item, idx) => {
			if (idx >= index || (item.meta && item.meta.affix)) {
				return true
			}
			const i = state.cachedViews.indexOf(item.name)
			if (i > -1) {
				state.cachedViews.splice(i, 1)
			}
			if (item.meta.link) {
				const fi = state.iframeViews.findIndex(v => v.path === item.path)
				state.iframeViews.splice(fi, 1)
			}
			return false
		})
	}
}

const actions = {
	addView({ dispatch }, view) {
		dispatch("addVisitedView", view)
		dispatch("addCachedView", view)
	},
	addIframeView({ commit }, view) {
		commit("ADD_IFRAME_VIEW", view)
	},
	addVisitedView({ commit }, view) {
		commit("ADD_VISITED_VIEW", view)
	},
	addCachedView({ commit }, view) {
		commit("ADD_CACHED_VIEW", view)
	},
	delView({ dispatch, state }, view) {
		return new Promise(resolve => {
			dispatch("delVisitedView", view)
			dispatch("delCachedView", view)
			resolve({
				visitedViews: [...state.visitedViews],
				cachedViews: [...state.cachedViews]
			})
		})
	},
	delVisitedView({ commit, state }, view) {
		return new Promise(resolve => {
			commit("DEL_VISITED_VIEW", view)
			resolve([...state.visitedViews])
		})
	},
	delIframeView({ commit, state }, view) {
		return new Promise(resolve => {
			commit("DEL_IFRAME_VIEW", view)
			resolve([...state.iframeViews])
		})
	},
	delCachedView({ commit, state }, view) {
		return new Promise(resolve => {
			commit("DEL_CACHED_VIEW", view)
			resolve([...state.cachedViews])
		})
	},
	delOthersViews({ dispatch, state }, view) {
		return new Promise(resolve => {
			dispatch("delOthersVisitedViews", view)
			dispatch("delOthersCachedViews", view)
			resolve({
				visitedViews: [...state.visitedViews],
				cachedViews: [...state.cachedViews]
			})
		})
	},
	delOthersVisitedViews({ commit, state }, view) {
		return new Promise(resolve => {
			commit("DEL_OTHERS_VISITED_VIEWS", view)
			resolve([...state.visitedViews])
		})
	},
	delOthersCachedViews({ commit, state }, view) {
		return new Promise(resolve => {
			commit("DEL_OTHERS_CACHED_VIEWS", view)
			resolve([...state.cachedViews])
		})
	},
	delAllViews({ dispatch, state }, view) {
		return new Promise(resolve => {
			dispatch("delAllVisitedViews", view)
			dispatch("delAllCachedViews", view)
			resolve({
				visitedViews: [...state.visitedViews],
				cachedViews: [...state.cachedViews]
			})
		})
	},
	delAllVisitedViews({ commit, state }) {
		return new Promise(resolve => {
			commit("DEL_ALL_VISITED_VIEWS")
			resolve([...state.visitedViews])
		})
	},
	delAllCachedViews({ commit, state }) {
		return new Promise(resolve => {
			commit("DEL_ALL_CACHED_VIEWS")
			resolve([...state.cachedViews])
		})
	},
	updateVisitedView({ commit }, view) {
		commit("UPDATE_VISITED_VIEW", view)
	},
	delRightTags({ commit }, view) {
		return new Promise(resolve => {
			commit("DEL_RIGHT_VIEWS", view)
			resolve([...state.visitedViews])
		})
	},
	delLeftTags({ commit }, view) {
		return new Promise(resolve => {
			commit("DEL_LEFT_VIEWS", view)
			resolve([...state.visitedViews])
		})
	}
}

export default {
	namespaced: true,
	state,
	mutations,
	actions
}
